Reactμ μ€νμ APIμΈ experimental_Offscreenμ ν΅ν μ€νμ€ν¬λ¦° λ λλ§μ νμν©λλ€. React μ ν리μΌμ΄μ μ μ±λ₯ κ°μ , μ¬μ©μ κ²½ν μ΅μ ν, λΆλλ¬μ΄ μ ν ν¨κ³Όλ₯Ό λ§λλ λ°©λ²μ μμ보μΈμ.
μ±λ₯ μ κΈ ν΄μ : React experimental_Offscreen μ¬μΈ΅ λΆμ
μ¬μ©μ μΈν°νμ΄μ€ ꡬμΆμ μν κ°λ ₯ν JavaScript λΌμ΄λΈλ¬λ¦¬μΈ Reactλ νλ μΉ μ ν리μΌμ΄μ
μ μꡬ μ¬νμ μΆ©μ‘±νκΈ° μν΄ μ§μμ μΌλ‘ λ°μ νκ³ μμ΅λλ€. μ΅κ·Όμ κ°μ₯ κΈ°λλλ μ€νμ κΈ°λ₯ μ€ νλλ experimental_Offscreen APIμ
λλ€. μ΄ κΈ°λ₯μ μ€νμ€ν¬λ¦° λ λλ§μ νμ±ννμ¬ μλΉν μ±λ₯ ν₯μμ μ½μν©λλ€. μ΄ μ’
ν© κ°μ΄λμμλ μ€νμ€ν¬λ¦° λ λλ§μ κ°λ
μ νμνκ³ , experimental_Offscreenμ μλ λ°©μμ μ΄ν΄νλ©°, μ΄λ₯Ό νμ©νμ¬ React μ ν리μΌμ΄μ
μ ν₯μμν€λ λ°©λ²μ μμ°ν΄ λ³΄κ² μ΅λλ€.
μ€νμ€ν¬λ¦° λ λλ§μ΄λ 무μμΈκ°μ?
μ€νμ€ν¬λ¦° λ λλ§μ λ³Έμ§μ μΌλ‘ μ»΄ν¬λνΈλ μ ν리μΌμ΄μ μ μΌλΆλ₯Ό νλ©΄μ μ¦μ νμνμ§ μκ³ λ°±κ·ΈλΌμ΄λμμ λ λλ§ν μ μκ² ν΄μ£Όλ κΈ°μ μ λλ€. λΈλΌμ°μ λ μ»΄ν¬λνΈλ₯Ό κ°μ λ²νΌμ λ λλ§νκ³ , ν΄λΉ μ»΄ν¬λνΈκ° νμν λ μ¬λ λλ§ λΉμ© μμ΄ μ μνκ² νμν μ μμ΅λλ€. μ΄ κΈ°μ μ νΉν λ€μκ³Ό κ°μ κ²½μ°μ μ μ©ν©λλ€:
- μ½ν μΈ μ¬μ λ λλ§: μ¬μ©μκ° μ»΄ν¬λνΈλ‘ μ΄λν λ λ°λ‘ μ¬μ©ν μ μλλ‘ λ―Έλ¦¬ λ λλ§ν©λλ€.
- μ ν ν¨κ³Ό κ°μ : νμ¬ νλ©΄μ΄ λ³΄μ΄λ λμ λ€μ νλ©΄μ 미리 λ λλ§νμ¬ λ λΆλλ¬μ΄ μ ν ν¨κ³Όλ₯Ό λ§λλλ€.
- μ΄κΈ° λ‘λ© μκ° μ΅μ ν: μ€μνμ§ μμ μ½ν μΈ μ λ λλ§μ μ§μ°μμΌ μ ν리μΌμ΄μ μ μ΄κΈ° λ‘λ© μκ°μ κ°μ ν©λλ€.
κΈλ‘λ² μ΄μ»€λ¨Έμ€ νλ«νΌμ μμν΄ λ³΄μΈμ. μ¬μ©μλ€μ μ¬λ¬ κ΅κ°μ μνμ λλ¬λ΄ λλ€. μ€νμ€ν¬λ¦° λ λλ§μ μ¬μ©νλ©΄ μ¬μ©μκ° μν λͺ©λ‘μ νμνλ λμ λ°±κ·ΈλΌμ΄λμμ μν μμΈ νμ΄μ§λ₯Ό 미리 λ λλ§νμ¬, νΉμ μνμ ν΄λ¦νμ λ λ λΉ λ₯΄κ³ λ°μμ±μ΄ μ’μ κ²½νμ 보μ₯ν μ μμ΅λλ€. μ΄λ λ λλ§ μκ°μ΄ μ¬μ©μ λ§μ‘±λμ ν° μν₯μ λ―ΈμΉ μ μλ λλ¦° μΈν°λ· μ°κ²°μ μ¬μ©νλ μ¬μ©μμκ² νΉν μ€μν©λλ€.
React experimental_Offscreen μκ°
Reactμ experimental_Offscreen APIλ μ€νμ€ν¬λ¦° λ λλ§μ μ μΈμ μΌλ‘ κ΄λ¦¬νλ λ°©λ²μ μ 곡ν©λλ€. μ΄λ₯Ό ν΅ν΄ μ»΄ν¬λνΈλ₯Ό <Offscreen> μμλ‘ κ°μΈκ³ μ»΄ν¬λνΈκ° λ λλ§λλ μμ κ³Ό λ°©μμ μ μ΄ν μ μμ΅λλ€. μ΄λ¦μμ μ μ μλ―μ΄ μ΄ APIλ νμ¬ μ€νμ μ΄λ©° ν₯ν React 릴리μ€μμ λ³κ²½λ μ μλ€λ μ μ μ μν΄μΌ ν©λλ€. λ°λΌμ μ μ€νκ² μ¬μ©νκ³ APIκ° λ°μ ν¨μ λ°λΌ μ½λλ₯Ό μμ ν μ€λΉλ₯Ό ν΄μΌ ν©λλ€.
experimental_Offscreenμ ν΅μ¬ μ리λ μ»΄ν¬λνΈμ κ°μμ±μ μ μ΄νλ κ²μ
λλ€. μ»΄ν¬λνΈκ° <Offscreen>μΌλ‘ κ°μΈμ§λ©΄ μ΄κΈ°μ λ°±κ·ΈλΌμ΄λμμ λ λλ§λ©λλ€. κ·Έλ° λ€μ mode propμ μ¬μ©νμ¬ μ»΄ν¬λνΈκ° νλ©΄μ νμλλ μμ κ³Ό 보μ΄μ§ μμ λλ κ³μ νμ± μνλ‘ μ μ§ν μ§ μ¬λΆλ₯Ό μ μ΄ν μ μμ΅λλ€.
<Offscreen>μ μ£Όμ Props
mode: μ΄ propμ<Offscreen>μ»΄ν¬λνΈμ λ λλ§ λμμ κ²°μ ν©λλ€. λ€μ λ κ°μ§ κ°μ κ°μ§ μ μμ΅λλ€:"visible": μ»΄ν¬λνΈκ° λ λλ§λμ΄ νλ©΄μ νμλ©λλ€."hidden": μ»΄ν¬λνΈκ° λ°±κ·ΈλΌμ΄λμμ λ λλ§λμ§λ§ νμλμ§λ μμ΅λλ€. μνμ DOM ꡬ쑰λ₯Ό 보쑴νλ©° "λκ²°λ(frozen)" μνλ‘ μ μ§λ©λλ€.
children: μ€νμ€ν¬λ¦°μΌλ‘ λ λλ§λ React μ»΄ν¬λνΈλ€μ λλ€.
React experimental_Offscreenμ μλ λ°©μ
experimental_Offscreenμ΄ λ΄λΆμ μΌλ‘ μ΄λ»κ² μλνλμ§ μμΈν μ΄ν΄λ³΄κ² μ΅λλ€:
- μ΄κΈ° λ λλ§: μ»΄ν¬λνΈκ°
<Offscreen mode="hidden">μΌλ‘ κ°μΈμ§λ©΄ Reactλ λ°±κ·ΈλΌμ΄λμμ μ»΄ν¬λνΈλ₯Ό λ λλ§ν©λλ€. μ¦, μ»΄ν¬λνΈμrenderν¨μκ° μ€νλκ³ DOM κ΅¬μ‘°κ° μμ±λμ§λ§ νλ©΄μλ νμλμ§ μμ΅λλ€. - μν λκ²°:
modeκ°"hidden"μΌλ‘ μ€μ λλ©΄ μ»΄ν¬λνΈμ μνκ° λ³΄μ‘΄λ©λλ€. μ΄λ μ»΄ν¬λνΈκ° μ²μλΆν° λ€μ λ λλ§ν νμ μμ΄ μ μνκ² νμλ μ μκ² ν΄μ£Όλ―λ‘ λ§€μ° μ€μν©λλ€. λ€μ μλ리μ€λ₯Ό μκ°ν΄ 보μΈμ: μ¬μ©μκ° μ¬λ¬ λ¨κ³μ μμμ μμ±νκ³ μμ΅λλ€. ν λ¨κ³κ°<Offscreen>μΌλ‘ κ°μΈμ Έ μ¨κ²¨μ§λ©΄, μ¬μ©μκ° λ€λ₯Έ κ³³μΌλ‘ μ΄λνλλΌλ ν΄λΉ λ¨κ³μ μ λ ₯ν λ°μ΄ν°κ° 보쑴λ©λλ€. - νμ μνλ‘ μ ν:
modeκ°"visible"λ‘ λ³κ²½λλ©΄ Reactλ 미리 λ λλ§λ μ»΄ν¬λνΈλ₯Ό ν¨μ¨μ μΌλ‘ νλ©΄μ νμν©λλ€. μ»΄ν¬λνΈκ° μ΄λ―Έ λ°±κ·ΈλΌμ΄λμμ λ λλ§λμκΈ° λλ¬Έμ, μ²μλΆν° λ λλ§νλ κ²λ³΄λ€ μ νμ΄ ν¨μ¬ λΉ λ₯΄κ³ λΆλλ½μ΅λλ€. - λ§μ΄νΈ ν΄μ :
<Offscreen>μ»΄ν¬λνΈκ° λ§μ΄νΈ ν΄μ λλ©΄(DOMμμ μ κ±°λλ©΄), Reactλ ν΄λΉ μμ μ»΄ν¬λνΈλ€λ λ§μ΄νΈ ν΄μ νμ¬ μ¬μ©νλ 리μμ€λ₯Ό ν΄μ ν©λλ€.
React experimental_Offscreen μ€μ μ¬μ© μμ
experimental_Offscreenμ κ°λ ₯ν¨μ 보μ¬μ£ΌκΈ° μν΄ λͺ κ°μ§ μ€μ μμ λ₯Ό μ΄ν΄λ³΄κ² μ΅λλ€:
1. ν μ½ν μΈ μ¬μ λ λλ§
κ°κ° λ€λ₯Έ λ°μ΄ν° μΈνΈλ₯Ό ν¬ν¨νλ μ¬λ¬ νμ΄ μλ μ¬μ©μ μΈν°νμ΄μ€λ₯Ό μμν΄ λ³΄μΈμ. μ΄κΈ° λ‘λ μ λͺ¨λ ν μ½ν
μΈ λ₯Ό λ λλ§νλ λμ (λ릴 μ μμ), experimental_Offscreenμ μ¬μ©νμ¬ λΉνμ± νμ μ½ν
μΈ λ₯Ό λ°±κ·ΈλΌμ΄λμμ 미리 λ λλ§ν μ μμ΅λλ€.
import React, { useState } from 'react';
import { unstable_Offscreen as Offscreen } from 'react';
function TabContent({ content }) {
return (
<div>
<p>{content}</p>
</div>
);
}
function Tabs() {
const [activeTab, setActiveTab] = useState('tab1');
return (
<div>
<nav>
<button onClick={() => setActiveTab('tab1')}>Tab 1</button>
<button onClick={() => setActiveTab('tab2')}>Tab 2</button>
</nav>
<Offscreen mode={activeTab === 'tab1' ? 'visible' : 'hidden'}>
<TabContent content="Content for Tab 1" />
</Offscreen>
<Offscreen mode={activeTab === 'tab2' ? 'visible' : 'hidden'}>
<TabContent content="Content for Tab 2" />
</Offscreen>
</div>
);
}
export default Tabs;
μ΄ μμ μμλ λ νμ μ½ν μΈ κ° μ΄κΈ°μ λͺ¨λ λ λλ§λμ§λ§ νμ± νλ§ νμλ©λλ€. μ¬μ©μκ° νμ μ ννλ©΄ μ½ν μΈ κ° μ΄λ―Έ λ°±κ·ΈλΌμ΄λμμ 미리 λ λλ§λμκΈ° λλ¬Έμ μ¦μ νμλ©λλ€. μ΄λ ν¨μ¬ λ λΆλλ½κ³ λ°μμ±μ΄ μ’μ μ¬μ©μ κ²½νμ μ 곡ν©λλ€.
2. λΌμ°ν° μ ν μ΅μ ν
μ¬μ©μκ° μ ν리μΌμ΄μ
μ κ²½λ‘ μ¬μ΄λ₯Ό μ΄λν λ μ κ²½λ‘μ μ½ν
μΈ κ° λ λλ§λλ©΄μ λμ λλ μ§μ°μ΄ λ°μν μ μμ΅λλ€. experimental_Offscreenμ μ¬μ©νλ©΄ νμ¬ κ²½λ‘κ° μμ§ λ³΄μ΄λ λμ λ€μ κ²½λ‘λ₯Ό 미리 λ λλ§νμ¬ λ§€λλ¬μ΄ μ νμ λ§λ€ μ μμ΅λλ€.
import React, { useState, useEffect } from 'react';
import { unstable_Offscreen as Offscreen } from 'react';
function Route({ path, component: Component, isVisible }) {
return (
<Offscreen mode={isVisible ? 'visible' : 'hidden'}>
<Component />
</Offscreen>
);
}
function Router() {
const [currentRoute, setCurrentRoute] = useState('/');
const [nextRoute, setNextRoute] = useState(null);
useEffect(() => {
// Simulate route change
setTimeout(() => {
setNextRoute('/about');
}, 1000);
}, []);
useEffect(() => {
if (nextRoute) {
// Simulate pre-rendering the next route
setTimeout(() => {
setCurrentRoute(nextRoute);
setNextRoute(null);
}, 500);
}
}, [nextRoute]);
return (
<div>
<Route path="/" component={() => <h1>Home Page</h1>} isVisible={currentRoute === '/'} />
<Route path="/about" component={() => <h1>About Page</h1>} isVisible={currentRoute === '/about'} />
</div>
);
}
export default Router;
μ΄ κ°μνλ μμ μμ μ¬μ©μκ° ννμ΄μ§μμ μκ° νμ΄μ§λ‘ μ΄λν λ, ννμ΄μ§κ° μμ§ λ³΄μ΄λ λμ μκ° νμ΄μ§κ° λ°±κ·ΈλΌμ΄λμμ 미리 λ λλ§λ©λλ€. μκ° νμ΄μ§κ° μ€λΉλλ©΄ λΆλλ½κ² νλ©΄μ μ νλμ΄ λνλ©λλ€. μ΄ κΈ°μ μ μ ν리μΌμ΄μ μ μ²΄κ° μ±λ₯μ ν¬κ² ν₯μμν¬ μ μμ΅λλ€.
3. 볡μ‘ν μ»΄ν¬λνΈ μ΅μ ν
볡μ‘ν λ λλ§ λ‘μ§μ΄λ λ¬΄κ±°μ΄ κ³μ°μ΄ μλ μ»΄ν¬λνΈμ κ²½μ°, experimental_Offscreenμ μ¬μ©νμ¬ νμν λκΉμ§ μ»΄ν¬λνΈ λ λλ§μ μ§μ°μν¬ μ μμ΅λλ€. μ΄λ μ ν리μΌμ΄μ
μ μ΄κΈ° λ‘λ μκ°μ κ°μ νκ³ λ©μΈ μ€λ λκ° μ°¨λ¨λλ κ²μ λ°©μ§νλ λ° λμμ΄ λ μ μμ΅λλ€.
import React, { useState, useEffect } from 'react';
import { unstable_Offscreen as Offscreen } from 'react';
function ComplexComponent() {
const [data, setData] = useState(null);
useEffect(() => {
// Simulate fetching data
setTimeout(() => {
setData({ message: 'Data loaded!' });
}, 2000);
}, []);
if (!data) {
return <p>Loading...</p>;
}
return <p>{data.message}</p>;
}
function App() {
const [showComponent, setShowComponent] = useState(false);
return (
<div>
<button onClick={() => setShowComponent(true)}>Show Complex Component</button>
<Offscreen mode={showComponent ? 'visible' : 'hidden'}>
<ComplexComponent />
</Offscreen>
</div>
);
}
export default App;
μ΄ μμ μμ ComplexComponentλ μ¬μ©μκ° "볡μ‘ν μ»΄ν¬λνΈ νμ" λ²νΌμ ν΄λ¦ν λλ§ λ λλ§λ©λλ€. κ·Έ μ μλ λ°±κ·ΈλΌμ΄λμμ λ λλ§λμ΄ λλ¨Έμ§ μ ν리μΌμ΄μ
μ΄ λΉ λ₯΄κ² λ‘λλ μ μλλ‘ ν©λλ€. μ΄λ νΉμ μ»΄ν¬λνΈκ° μΈλΆ λ°μ΄ν°λ κ³μ°μ μμ‘΄νμ¬ μ΄κΈ° νμ΄μ§ λ λλ§μ μ§μ°μν¬ μ μλ κ²½μ°μ μ μ©ν©λλ€.
React experimental_Offscreen μ¬μ©μ μ΄μ
React experimental_Offscreen μ¬μ©μ μ΄μ μ λ€μκ³Ό κ°μ΄ λ€μν©λλ€:
- μ±λ₯ ν₯μ: μ»΄ν¬λνΈλ₯Ό λ°±κ·ΈλΌμ΄λμμ 미리 λ λλ§ν¨μΌλ‘μ¨ νλ©΄μ νμνλ λ° κ±Έλ¦¬λ μκ°μ μ€μ¬ λ λΉ λ₯΄κ³ λ°μμ±μ΄ μ’μ μ¬μ©μ κ²½νμ μ 곡ν©λλ€.
- λΆλλ¬μ΄ μ ν:
experimental_Offscreenμ νμ¬ νλ©΄μ΄ μμ§ λ³΄μ΄λ λμ λ€μ νλ©΄μ 미리 λ λλ§νμ¬ κ²½λ‘ λλ μ»΄ν¬λνΈ κ°μ λ λΆλλ¬μ΄ μ νμ κ°λ₯νκ² ν©λλ€. - μ΄κΈ° λ‘λ© μκ° μ΅μ ν: μ€μνμ§ μμ μ½ν μΈ μ λ λλ§μ μ§μ°μν΄μΌλ‘μ¨ μ ν리μΌμ΄μ μ μ΄κΈ° λ‘λ© μκ°μ κ°μ νμ¬ λλ¦° μΈν°λ· μ°κ²°μ μ¬μ©νλ μ¬μ©μμκ² λ μ½κ² μ κ·Όν μ μλλ‘ ν©λλ€.
- λ λμ 리μμ€ κ΄λ¦¬: μ»΄ν¬λνΈκ° λ λλ§λκ³ νμ± μνλ‘ μ μ§λλ μμ μ μ μ΄ν¨μΌλ‘μ¨ λ¦¬μμ€ μ¬μ©μ μ΅μ ννκ³ λΆνμν λ λλ§μ λ°©μ§νμ¬ μ ν리μΌμ΄μ μ μ λ°μ μΈ μ±λ₯μ ν₯μμν¬ μ μμ΅λλ€.
κ³ λ € μ¬ν λ° λͺ¨λ² μ¬λ‘
experimental_Offscreenμ μλΉν μ΄μ μ μ 곡νμ§λ§ λ€μ μ¬νμ κ³ λ €νλ κ²μ΄ μ€μν©λλ€:
- μ€νμ νΉμ±: μ΄λ¦μμ μ μ μλ―μ΄ μ΄ APIλ μμ§ μ€νμ μ λλ€. APIκ° λ³κ²½λ μ μλ€λ μ μ μΈμ§νκ³ μ΄λ¬ν λ³κ²½μ μ μν μ μλλ‘ ν΄μΌ ν©λλ€.
- λ©λͺ¨λ¦¬ μ¬μ©λ: λ°±κ·ΈλΌμ΄λμμ μ»΄ν¬λνΈλ₯Ό 미리 λ λλ§νλ©΄ λ λ§μ λ©λͺ¨λ¦¬λ₯Ό μλΉν μ μμΌλ©°, νΉν ν¬κ±°λ 볡μ‘ν μ»΄ν¬λνΈλ₯Ό 미리 λ λλ§νλ κ²½μ° λμ± κ·Έλ μ΅λλ€. μ±λ₯κ³Ό λ©λͺ¨λ¦¬ μ¬μ©λ κ°μ κ· νμ μ μ€νκ² κ³ λ €ν΄μΌ ν©λλ€.
- 볡μ‘μ±: μ€νμ€ν¬λ¦° λ λλ§μ λμ
νλ©΄ μ ν리μΌμ΄μ
μ 볡μ‘μ±μ΄ μΆκ°λ μ μμ΅λλ€. ꡬνμ μ μ€νκ² κ³ννκ³
experimental_Offscreenμ¬μ©μ μλ―Έλ₯Ό μ΄ν΄νλ κ²μ΄ μ€μν©λλ€. - ν
μ€ν
:
experimental_Offscreenμ΄ μμλλ‘ μλνλμ§, μμμΉ λͺ»ν λΆμμ©μ μΌμΌν€μ§ μλμ§ νμΈνκΈ° μν΄ μ ν리μΌμ΄μ μ μ² μ ν ν μ€νΈν΄μΌ ν©λλ€.
λͺ¨λ² μ¬λ‘
- μ νμ μΌλ‘ μ¬μ©νκΈ°: μ ν리μΌμ΄μ
μ λͺ¨λ μ»΄ν¬λνΈμ
experimental_Offscreenμ μ¬μ©νμ§ λ§μΈμ. μ±λ₯ λ³λͺ© νμμ΄ μκ±°λ μ¬μ λ λλ§μ μ΄μ μ μ»μ μ μλ μ»΄ν¬λνΈμ μ§μ€νμΈμ. - μ±λ₯ μΈ‘μ νκΈ°:
experimental_Offscreenμ ꡬννκΈ° μ κ³Ό νμ μ ν리μΌμ΄μ μ μ±λ₯μ μΈ‘μ νμ¬ μ€μ λ‘ μ±λ₯μ΄ ν₯μλμλμ§ νμΈνμΈμ. Chrome DevToolsμ μ±λ₯ ν¨λκ³Ό κ°μ λꡬλ₯Ό μ¬μ©νμ¬ λ λλ§ μκ°μ λΆμνκ³ μ μ¬μ μΈ λ³λͺ© νμμ μλ³νμΈμ. - λ©λͺ¨λ¦¬ μ¬μ©λ λͺ¨λν°λ§νκΈ°: λ°±κ·ΈλΌμ΄λμμ μ»΄ν¬λνΈλ₯Ό 미리 λ λλ§νλ κ²μ΄ λ©λͺ¨λ¦¬ λ¬Έμ λ₯Ό μΌμΌν€μ§ μλλ‘ μ ν리μΌμ΄μ μ λ©λͺ¨λ¦¬ μ¬μ©λμ μ£ΌμνμΈμ.
- μ½λ λ¬ΈμννκΈ°:
experimental_Offscreenμ μ¬μ©νλ μ΄μ μ μλ λ°©μμ μ€λͺ νκΈ° μν΄ μ½λλ₯Ό λͺ ννκ² λ¬ΈμννμΈμ. μ΄λ λ€λ₯Έ κ°λ°μκ° μ½λλ₯Ό μ΄ν΄νκ³ μ μ§λ³΄μλ₯Ό λ μ½κ² λ§λλ λ° λμμ΄ λ©λλ€.
React Suspenseμμ ν΅ν©
experimental_Offscreenμ React Suspenseμ μννκ² ν΅ν©λμ΄ μ¬μ©μ κ²½νμ λμ± ν₯μμν¬ μ μμ΅λλ€. Suspenseλ₯Ό μ¬μ©νλ©΄ λ°μ΄ν°λ 리μμ€ λ‘λλ₯Ό κΈ°λ€λ¦¬λ λμ μ»΄ν¬λνΈ λ λλ§μ "μΌμ μ€λ¨"ν μ μμ΅λλ€. experimental_Offscreenκ³Ό κ²°ν©νλ©΄ λ°μ΄ν°λ₯Ό κΈ°λ€λ¦¬λ λμ λ°±κ·ΈλΌμ΄λμμ μ»΄ν¬λνΈλ₯Ό 미리 λ λλ§ν λ€μ, λ°μ΄ν°κ° λ‘λλλ©΄ νλ©΄μ νμν μ μμ΅λλ€.
import React, { Suspense } from 'react';
import { unstable_Offscreen as Offscreen } from 'react';
const fetchData = () => {
return new Promise((resolve) => {
setTimeout(() => {
resolve({ message: 'Data loaded!' });
}, 2000);
});
};
const Resource = () => {
const [data, setData] = React.useState(null);
React.useEffect(() => {
fetchData().then(setData);
}, []);
if (!data) {
throw new Promise((resolve) => setTimeout(resolve, 2000)); // Simulate suspense
}
return <p>{data.message}</p>;
};
function App() {
return (
<div>
<Suspense fallback=<p>Loading...</p>>
<Offscreen mode="visible">
<Resource />
</Offscreen>
</Suspense>
</div>
);
}
export default App;
μ΄ μμ μμ Resource μ»΄ν¬λνΈλ λ°μ΄ν° λ‘λ©μ μ²λ¦¬νκΈ° μν΄ Suspenseλ₯Ό μ¬μ©ν©λλ€. <Offscreen> μ»΄ν¬λνΈλ Resource μ»΄ν¬λνΈκ° λ°μ΄ν°λ₯Ό κΈ°λ€λ¦¬λ λμ λ°±κ·ΈλΌμ΄λμμ 미리 λ λλ§λλλ‘ λ³΄μ₯ν©λλ€. λ°μ΄ν°κ° λ‘λλλ©΄ μ»΄ν¬λνΈκ° νλ©΄μ λΆλλ½κ² νμλμ΄ λκΉ μλ μ¬μ©μ κ²½νμ μ 곡ν©λλ€.
κΈλ‘λ² μ κ·Όμ± κ³ λ € μ¬ν
experimental_Offscreenμ ꡬνν λλ λͺ¨λ μ¬λμ΄ λ₯λ ₯μ΄λ μμΉμ κ΄κ³μμ΄ μ ν리μΌμ΄μ
μ μ¬μ©ν μ μλλ‘ κΈλ‘λ² μ κ·Όμ± κ°μ΄λλΌμΈμ κ³ λ €νλ κ²μ΄ μ€μν©λλ€.
- ν€λ³΄λ νμ:
<Offscreen>μμ λ΄μ λͺ¨λ μ»΄ν¬λνΈκ° ν€λ³΄λ νμμ ν΅ν΄ μ κ·Ό κ°λ₯νμ§ νμΈνμΈμ. μ»΄ν¬λνΈκ° μ¨κ²¨μ§ κ²½μ° ν€λ³΄λ νμ νλ¦μ λ°©ν΄νμ§ μλλ‘ ν΄μΌ ν©λλ€. - μ€ν¬λ¦° 리λ νΈνμ±: μ€νμ€ν¬λ¦°μΌλ‘ λ λλ§λ μ½ν μΈ κ° νλ©΄μ νμλ λ μ€ν¬λ¦° 리λμμ μ¬λ°λ₯΄κ² μλ΄λλμ§ ν μ€νΈνμΈμ. μ μ ν ARIA μμ±μ μ¬μ©νμ¬ λ§₯λ½κ³Ό μλ―Έ μ 보λ₯Ό μ 곡νμΈμ.
- νμ§ν: μ ν리μΌμ΄μ μ΄ μ¬λ¬ μΈμ΄λ₯Ό μ§μνλ κ²½μ°, μ€νμ€ν¬λ¦°μΌλ‘ λ λλ§λ μ½ν μΈ κ° λͺ¨λ μΈμ΄μμ μ¬λ°λ₯΄κ² νμ§νλκ³ νμλλμ§ νμΈνμΈμ.
- μκ°λ: μκ°μ λ―Όκ°ν μ 보λ₯Ό νμνλ μ½ν μΈ λ₯Ό 미리 λ λλ§ν λλ μ¬μ©μμ μκ°λλ₯Ό κ³ λ €νμ¬ μ λ³΄κ° μ ννκ³ κ΄λ ¨μ±μ΄ μλλ‘ ν΄μΌ ν©λλ€.
- λ¬Ένμ λ―Όκ°μ±: μ΄λ―Έμ§, ν μ€νΈ λλ κΈ°νΈκ° ν¬ν¨λ μ½ν μΈ λ₯Ό 미리 λ λλ§ν λλ λ¬Ένμ μ°¨μ΄λ₯Ό μ λ ν΄μΌ ν©λλ€. μ½ν μΈ κ° λ€μν λ¬Ένμ μ μ νκ³ μ‘΄μ€νλμ§ νμΈνμΈμ.
React experimental_Offscreenμ λμ
experimental_Offscreenμ μ±λ₯μ μ΅μ ννλ κ°λ ₯ν λ°©λ²μ μ 곡νμ§λ§, κ³ λ €ν μ μλ λ€λ₯Έ κΈ°μ λ€λ μμ΅λλ€:
- μ½λ λΆν : μ½λ λΆν μ μ ν리μΌμ΄μ μ νμμ λ°λΌ λ‘λν μ μλ λ μμ μ²ν¬λ‘ λλλ κ²μ ν¬ν¨ν©λλ€. μ΄λ μ ν리μΌμ΄μ μ μ΄κΈ° λ‘λ μκ°μ ν¬κ² μ€μ΄κ³ μ λ°μ μΈ μ±λ₯μ ν₯μμν¬ μ μμ΅λλ€.
- μ§μ° λ‘λ©(Lazy Loading): μ§μ° λ‘λ©μ μ»΄ν¬λνΈλ 리μμ€λ₯Ό νμν λλ§ λ‘λνλ κ²μ ν¬ν¨ν©λλ€. μ΄λ μ΄κΈ°μ λ‘λν΄μΌ νλ λ°μ΄ν°μ μμ μ€μ¬ μ ν리μΌμ΄μ μ μ΄κΈ° λ‘λ μκ°μ κ°μ νλ λ° λμμ΄ λ μ μμ΅λλ€.
- λ©λͺ¨μ΄μ μ΄μ (Memoization): λ©λͺ¨μ΄μ μ΄μ μ λΉμ©μ΄ λ§μ΄ λλ ν¨μ νΈμΆ κ²°κ³Όλ₯Ό μΊμ±νκ³ λμΌν μ λ ₯μ΄ λ€μ μ 곡λ λ μ¬μ¬μ©νλ κ²μ ν¬ν¨ν©λλ€. μ΄λ μ»΄ν¬λνΈλ₯Ό λ λλ§νλ λ° κ±Έλ¦¬λ μκ°μ μ€μ΄λ λ° λμμ΄ λ μ μμ΅λλ€.
- κ°μν(Virtualization): κ°μνλ ν° λͺ©λ‘μ΄λ ν μ΄λΈμ 보μ΄λ λΆλΆλ§ λ λλ§νλ κ²μ ν¬ν¨ν©λλ€. μ΄λ λλμ λ°μ΄ν°λ₯Ό νμνλ μ ν리μΌμ΄μ μ μ±λ₯μ ν¬κ² ν₯μμν¬ μ μμ΅λλ€.
κ²°λ‘
React experimental_Offscreenμ React μ ν리μΌμ΄μ
μ μ±λ₯μ μ΅μ ννλ κ°λ ₯ν λꡬμ
λλ€. μ€νμ€ν¬λ¦° λ λλ§μ νμ±νν¨μΌλ‘μ¨ λ°±κ·ΈλΌμ΄λμμ μ½ν
μΈ λ₯Ό 미리 λ λλ§νκ³ , μ νμ κ°μ νλ©°, μ΄κΈ° λ‘λ μκ°μ μ΅μ νν μ μμ΅λλ€. κ·Έλ¬λ μ΄κ²μ΄ μμ§ μ€νμ μΈ APIμ΄λ©° μ μ€νκ² μ¬μ©ν΄μΌ νλ€λ μ μ κΈ°μ΅νλ κ²μ΄ μ€μν©λλ€. νμ μ±λ₯ μν₯μ μΈ‘μ νκ³ μ κ·Όμ±μ κ³ λ €νμ¬ μ§μ μΌλ‘ κΈλ‘λ²νκ³ ν¬μ©μ μΈ μ¬μ©μ κ²½νμ λ§λ€μ΄μΌ ν©λλ€. μ΄ ν₯λ―Έλ‘μ΄ κΈ°λ₯λ€μ νμνμ¬ React νλ‘μ νΈμμ μλ‘μ΄ μ°¨μμ μ±λ₯μ μ κΈ ν΄μ νκ³ μ μΈκ³μ μΌλ‘ λ°μ΄λ μ¬μ©μ κ²½νμ μ 곡νμΈμ.
experimental_Offscreenμ μλ λ°©μμ μ΄ν΄νκ³ λͺ¨λ² μ¬λ‘λ₯Ό λ°λ₯΄λ©΄, κ·Έ νμ νμ©νμ¬ μ μΈκ³ μ¬μ©μλ₯Ό μν λ λΉ λ₯΄κ³ , λ λΆλλ½κ³ , λ λ°μμ±μ΄ μ’μ React μ ν리μΌμ΄μ
μ λ§λ€ μ μμ΅λλ€.